package com.dhcc.utils;

import com.dhcc.entity.SysUserResource;
import com.dhcc.vo.SysClientResourceListTree;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class ResourceTreeBuilder {
    /**
     * 构建资源树
     *
     * @param allResources 所有资源列表（原始 SysResource 列表）
     * @param parentId     父资源 ID，根资源为 null
     * @return 资源树
     */
    public static List<SysClientResourceListTree> buildResourceTree(List<SysUserResource> allResources, String parentId) {
        // 将 SysResource 转换为 SysResourceVO
        List<SysClientResourceListTree> allResourceVOs = convertToResourceVOList(allResources);

        // 使用转换后的 VO 列表递归构建树
        return buildTreeFromVO(allResourceVOs, parentId);
    }

    /**
     * 将 List<SysResource> 转换为 List<SysResourceVO>
     *
     * @param allResources 原始资源列表
     * @return 转换后的资源 VO 列表
     */
    private static List<SysClientResourceListTree> convertToResourceVOList(List<SysUserResource> allResources) {
        List<SysClientResourceListTree> voList = new ArrayList<>();
        for (SysUserResource resource : allResources) {
            voList.add(convertToVO(resource));
        }
        return voList;
    }

    /**
     * 构建资源树（直接操作 SysResourceVO 列表）
     *
     * @param allResources 所有资源 VO 列表
     * @param parentId     父资源 ID，根资源为 null
     * @return 资源树
     */
    public static List<SysClientResourceListTree> buildTreeFromVO(List<SysClientResourceListTree> allResources, String parentId) {
        List<SysClientResourceListTree> tree = new ArrayList<>();
        for (SysClientResourceListTree resource : allResources) {
            // 判断当前资源是否属于指定父资源
            if (Objects.equals(resource.getResourceParentId(), parentId)) {
                // 递归设置子资源
                resource.setChildren(buildTreeFromVO(allResources, resource.getResourceId()));
                tree.add(resource);
            }
        }
        return tree;
    }

    /**
     * 将 SysResource 转换为 SysResourceVO
     *
     * @param resource SysResource 实体
     * @return SysResourceVO 对象
     */
    public static SysClientResourceListTree convertToVO(SysUserResource resource) {
        SysClientResourceListTree vo = new SysClientResourceListTree();
        BeanUtils.copyProperties(resource, vo);
        return vo;
    }
}
